home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Eudora 1.3.1 / source / undo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  3.7 KB  |  127 lines  |  [TEXT/MPS ]

  1. #define FILE_NUM 40
  2. /* Copyright (c) 1990-1992 by the University of Illinois Board of Trustees */
  3. /************************************************************************
  4.  * routines for undoing editing changes
  5.  ************************************************************************/
  6. #pragma load EUDORA_LOAD
  7. #pragma segment Lib
  8.  
  9. /************************************************************************
  10.  * DoUndo - undo the last undoable operation
  11.  ************************************************************************/
  12. void DoUndo(void)
  13. {
  14.     long size;
  15.     UHandle redoText=nil;
  16.     short oldNl;
  17.     MyWindowPtr win;
  18.     short selStart,selEnd;
  19.  
  20.     if (!Undo.teh) return;
  21.     win = (*Undo.teh)->inPort;
  22.     
  23.     selStart = (*Undo.teh)->selStart;
  24.     selEnd = (*Undo.teh)->selEnd;
  25.     if (win->qWindow.windowKind==COMP_WIN) oldNl = CountTeLines(Undo.teh);
  26.     
  27.     if (size = Undo.goTil - Undo.startFrom)
  28.     {
  29.         if (!(redoText = NuHandle(size)))
  30.             {WarnUser(WONT_UNDO,MemError());return;}
  31.         BlockMove(*(*Undo.teh)->hText+Undo.startFrom,
  32.                                                                                                 *redoText,size);
  33.         NoScrollTESetSelect(Undo.startFrom,Undo.goTil,Undo.teh);
  34.         TEDelete(Undo.teh);
  35.         Undo.goTil = Undo.startFrom;
  36.     }
  37.     
  38.     if (Undo.text)
  39.     {
  40.         NoScrollTESetSelect(Undo.startFrom,Undo.startFrom,Undo.teh);
  41.         TEInsert(LDRef(Undo.text),GetHandleSize(Undo.text),Undo.teh);
  42.         DisposHandle(Undo.text);
  43.         Undo.goTil = (*Undo.teh)->selEnd;
  44.     }
  45.     
  46.     NoScrollTESetSelect(Undo.oldSelStart,Undo.oldSelEnd,Undo.teh);
  47.     
  48.     Undo.didUndo = !Undo.didUndo;
  49.     Undo.text = redoText;
  50.     Undo.oldSelStart = selStart;
  51.     Undo.oldSelEnd = selEnd;
  52.     
  53.     win->isDirty = True;
  54.     if (win->textChanged) (*win->textChanged)(win,Undo.teh,oldNl,CountTeLines(Undo.teh));
  55.     ShowInsertion(win,InsertAny);
  56.     Undo.didClick=True;
  57.     
  58.     SetUndoMenu();    
  59. }
  60.  
  61. /************************************************************************
  62.  * NukeUndo - remove the undo, if it pertains to this window
  63.  ************************************************************************/
  64. void NukeUndo(MyWindowPtr win)
  65. {
  66.     if (win && win==Undo.win)
  67.     {
  68.         if (Undo.text) ZapHandle(Undo.text);
  69.         Undo.startFrom = Undo.goTil = 0;
  70.         Undo.win = nil;
  71.         SetUndoMenu();
  72.     }
  73. }
  74.  
  75. /************************************************************************
  76.  * TEPrepareUndo - stash information for undo
  77.  ************************************************************************/
  78. void TEPrepareUndo(MyWindowPtr win,TEEnum what)
  79. {
  80.     long size;
  81.     
  82.     if (what==TECOPY || Undo.win==win && Undo.teh==WinTEH(win) && what==TEKEY &&
  83.             Undo.wasWhat==TEKEY && !Undo.didClick)
  84.         return;
  85.     
  86.     if (Undo.text) ZapHandle(Undo.text);    /* out with the old */
  87.     Undo.startFrom = Undo.goTil = 0;
  88.     
  89.     Undo.win = win;
  90.     Undo.teh = WinTEH(win);
  91.     Undo.oldSelStart = (*Undo.teh)->selStart;
  92.     Undo.oldSelEnd = (*Undo.teh)->selEnd;
  93.     if (size = (*Undo.teh)->selEnd - (*Undo.teh)->selStart)
  94.     {
  95.         if (!(Undo.text = NuHandle(size)))
  96.             {WarnUser(WONT_UNDO,MemError());return;}
  97.         BlockMove(*(*Undo.teh)->hText+(*Undo.teh)->selStart,
  98.                                                                                                 *Undo.text,size);
  99.     }
  100.     Undo.startFrom = Undo.goTil = (*Undo.teh)->selStart;
  101.     Undo.oldSelStart = (*Undo.teh)->selStart;
  102.     Undo.oldSelEnd = (*Undo.teh)->selEnd;
  103.     Undo.wasWhat = what;
  104.     Undo.didUndo = Undo.didClick = False;
  105.     SetUndoMenu();
  106. }
  107.  
  108. /************************************************************************
  109.  * SetUndoMenu - set the Undo menu properly
  110.  ************************************************************************/
  111. void SetUndoMenu(void)
  112. {
  113.     Str63 scratch;
  114.     if (!Undo.text && Undo.startFrom==Undo.goTil || !Undo.teh)
  115.     {
  116.         DisableItem(GetMHandle(EDIT_MENU),EDIT_UNDO_ITEM);
  117.         GetRString(scratch,UNDO);
  118.     } 
  119.     else
  120.     {
  121.         EnableItem(GetMHandle(EDIT_MENU),EDIT_UNDO_ITEM);
  122.         GetRString(scratch,UNDO_STRN+Undo.wasWhat+(Undo.didUndo?TEENUM_LIMIT-1:0));
  123.     }
  124.     ASSERT(*scratch!=0);
  125.     SetItem(GetMHandle(EDIT_MENU),EDIT_UNDO_ITEM,scratch);
  126. }
  127.